package org.sofun.subscription.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 日志使用示例类
 */
@Component
public class LoggingExample {
    
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
    
    /**
     * 演示不同级别的日志使用
     */
    public void demonstrateLogging() {
        logger.info("=== 日志使用示例 ===");
        
        // INFO级别 - 业务操作日志
        logger.info("开始执行业务操作");
        logger.info("用户ID: {}, 操作类型: {}", "12345", "申购开放日生成");
        
        // DEBUG级别 - 详细调试信息
        logger.debug("调试信息：当前处理的参数为 {}", "月度申购");
        logger.debug("方法执行时间: {} ms", 150);
        
        // WARN级别 - 警告信息
        logger.warn("检测到潜在问题：开放日序号 {} 接近最大值", 30);
        
        // ERROR级别 - 错误信息
        try {
            // 模拟异常
            throw new RuntimeException("模拟业务异常");
        } catch (Exception e) {
            logger.error("业务操作失败: {}", e.getMessage(), e);
        }
        
        // 带参数的日志
        String ruleName = "月度申购规则";
        int dayCount = 5;
        logger.info("应用规则 [{}]，生成了 {} 个开放日", ruleName, dayCount);
        
        // 条件日志（避免不必要的字符串拼接）
        if (logger.isDebugEnabled()) {
            String expensiveOperation = performExpensiveOperation();
            logger.debug("昂贵操作结果: {}", expensiveOperation);
        }
        
        logger.info("日志示例执行完成");
    }
    
    /**
     * 演示业务流程日志
     */
    public void demonstrateBusinessLogging() {
        logger.info("=== 业务流程日志示例 ===");
        
        // 开始业务流程
        logger.info("开始申购开放日生成流程");
        
        // 步骤1
        logger.info("步骤1: 参数校验");
        logger.debug("校验参数: 交易频率=MONTHLY, 开放日序号=1");
        logger.info("参数校验通过");
        
        // 步骤2
        logger.info("步骤2: 计算周期范围");
        logger.debug("计算周期: 2025-06 (2025-06-01 ~ 2025-06-30)");
        logger.info("周期范围计算完成");
        
        // 步骤3
        logger.info("步骤3: 生成开放日");
        logger.debug("目标开放日: 2025-06-01");
        logger.debug("调整后开放日: 2025-06-01 (无需调整)");
        logger.info("开放日生成完成: 2025-06-01");
        
        // 完成业务流程
        logger.info("申购开放日生成流程完成，共生成 1 个开放日");
    }
    
    /**
     * 演示异常日志处理
     */
    public void demonstrateExceptionLogging() {
        logger.info("=== 异常日志处理示例 ===");
        
        try {
            // 模拟参数异常
            validateParameter(null);
        } catch (IllegalArgumentException e) {
            logger.error("参数校验失败: {}", e.getMessage());
        }
        
        try {
            // 模拟业务异常
            processBusinessLogic();
        } catch (Exception e) {
            logger.error("业务处理异常", e);
        }
        
        try {
            // 模拟系统异常
            systemOperation();
        } catch (Exception e) {
            logger.error("系统异常 - 操作: {}, 错误: {}", "数据库连接", e.getMessage(), e);
        }
    }
    
    /**
     * 演示性能日志
     */
    public void demonstratePerformanceLogging() {
        logger.info("=== 性能日志示例 ===");
        
        long startTime = System.currentTimeMillis();
        
        logger.info("开始执行耗时操作");
        
        // 模拟耗时操作
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        
        logger.info("耗时操作完成，执行时间: {} ms", duration);
        
        if (duration > 1000) {
            logger.warn("操作执行时间过长: {} ms，建议优化", duration);
        }
    }
    
    // 辅助方法
    private String performExpensiveOperation() {
        // 模拟昂贵操作
        return "昂贵操作的结果";
    }
    
    private void validateParameter(Object param) {
        if (param == null) {
            throw new IllegalArgumentException("参数不能为空");
        }
    }
    
    private void processBusinessLogic() {
        throw new RuntimeException("业务逻辑处理失败");
    }
    
    private void systemOperation() {
        throw new RuntimeException("数据库连接超时");
    }
    
    /**
     * 运行所有日志示例
     */
    public void runAllExamples() {
        demonstrateLogging();
        demonstrateBusinessLogging();
        demonstrateExceptionLogging();
        demonstratePerformanceLogging();
    }
}
